<?php

namespace Wgx\Admin\Com\Crud;

use Wgx\Admin\Com\AdminMenuRightsUtil;
use Wgx\Admin\Entity\AdminToMenuEntity;

class CrudField
{
    const ShowInNone = 0;
    const ShowInListPage = 0b00000001; // 1
    const ShowInReadPage = 0b00000010; // 2
    const ShowInEditPage = 0b00000100; // 4
    const ShowInExport = 0b00001000; // 8
    const ShowInAll = 0b11111111; // 255

    /** @var string */
    private $name;
    /** @var string */
    private $hName;
    /** @var string */
    private $tips;
    /** @var int */
    private $showIn = 0;

    // ----------
    /**
     * 列表页(listpage) 中本字段的宽度
     * DataTables-Columns columns.width
     * @var null|string
     */
    private $lpWidth = null;

    /**
     * 列表页(listpage) 中本字段是否可以排序
     * @var bool
     */
    private $lpIsSortable = false;

    /**
     * 列表页(listpage) 中本字段的前端渲染
     * DataTables-Columns columns.render, 前端渲染
     * @var null|string
     */
    private $lpRender = null;

    /**
     * 列表页(listpage) 中本字段的前端 class
     * DataTables-Columns columns.className
     * @var null|string
     */
    private $lpClassName = null;
    // ----------

    /**
     * 编辑页(editpage) 具体用到的用户输入控件
     * null时 编辑页(editpage) 将只展示字段的值，无法展示出一个控件让用户输入
     * @var null|EditPageInputBase
     */
    private $epInputWidget = null;

    // ----------

    /**
     * 获取列表页(listpage) 中操作(operate)字段的前端渲染,
     * DataTables-Columns columns.render, 前端渲染
     * @param Crud $crud
     * @return string
     * @throws \Exception
     */
    public static function getLpOperateRender(Crud $crud)
    {
        // 示例
        $render = <<<'OPERATERENDER'
function (data, type, row, meta) {
    return '<button class="operate op-read">查看</button><button class="operate op-edit">修改</button><button class="operate op-delete">删除</button>';
}
OPERATERENDER;

        $operate = '';
        $rights = AdminMenuRightsUtil::getSingleObj()->getCurrentRights();
        if ($rights) {
            if (($rights & AdminToMenuEntity::RightRead) > 0) {
                $target = $crud->getPageDisplayTarget(Crud::PageReadPage);
                $pageWidth = $crud->getPageDisplayWidth(Crud::PageReadPage);
                $pageHeight = $crud->getPageDisplayHeight(Crud::PageReadPage);
                if (empty($target)) {
                    $target = '_blank';
                }
                $operate .= '<a class="operate op-read" href="#"'
                    . ($target == 'layer' ? '' : ' target="' . $target . '"')
                    . ' title="查看"'
                    . ' data-target="' . $target . '"'
                    . ' data-width="' . $pageWidth . '"'
                    . ' data-height="' . $pageHeight . '"'
                    . '><i class="fas fa-search-plus"></i></a>';
            }
            if (($rights & AdminToMenuEntity::RightUpdate) > 0) {
                $target = $crud->getPageDisplayTarget(Crud::PageEditPage);
                $pageWidth = $crud->getPageDisplayWidth(Crud::PageEditPage);
                $pageHeight = $crud->getPageDisplayHeight(Crud::PageEditPage);
                if (empty($target)) {
                    $target = '_blank';
                }
                $operate .= '<a class="operate op-edit" href="#"'
                    . ($target == 'layer' ? '' : ' target="' . $target . '"')
                    . ' title="修改"'
                    . ' data-target="' . $target . '"'
                    . ' data-width="' . $pageWidth . '"'
                    . ' data-height="' . $pageHeight . '"'
                    . '><i class="fas fa-pencil-alt"></i></a>';
            }
            if (($rights & AdminToMenuEntity::RightDelete) > 0) {
                $operate .= '<a class="operate op-delete" href="#" onclick="return false;" title="删除"><i class="far fa-trash-alt"></i></a>';
            }
        }

        return
            'function (data, type, row, meta) {'
            . " return '" . $operate . "';"
            . ' }';
    }
    // ----------

    /**
     * CrudField constructor.
     * @param string $name - 字段名
     * @param string $hName - human readable name, 人们可读的字段名
     * @param string $tips - 字段注释/提示，展示给用户看，让用户明白字段的用途
     * @param int $showIn - 本字段可以展示在那些页面中, refer self::ShowInXX | self::ShowInYY
     */
    public function __construct($name, $hName, $tips = '', $showIn = 0)
    {
        $this->name = empty($name) ? null : trim($name);
        $this->hName = $hName;
        $this->tips = $tips;
        $this->showIn = $showIn;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * human readable name, 人们可读的字段名
     * @return string
     */
    public function getHName()
    {
        return $this->hName;
    }

    /**
     * @param string $hName - human readable name, 人们可读的字段名
     * @return CrudField
     */
    public function setHName($hName)
    {
        $this->hName = $hName;
        return $this;
    }

    /**
     * @return string
     */
    public function getTips()
    {
        return $this->tips;
    }

    /**
     * @param string $tips
     * @return CrudField
     */
    public function setTips($tips)
    {
        $this->tips = $tips;
        return $this;
    }

    /**
     * 本字段可以展示在那些页面中, refer self::ShowInXX | self::ShowInYY
     * @return int
     */
    public function getShowIn()
    {
        return $this->showIn;
    }

    /**
     * @param int $showIn - 本字段可以展示在那些页面中, refer self::ShowInXX | self::ShowInYY
     * @return CrudField
     */
    public function setShowIn($showIn)
    {
        $this->showIn = $showIn;
        return $this;
    }

    /**
     * 列表页(listpage) 中本字段的宽度
     * DataTables-Columns columns.width
     * @return string|null
     */
    public function getLpWidth()
    {
        return $this->lpWidth;
    }

    /**
     * @param string|null $lpWidth - 列表页(listpage) 中本字段的宽度, DataTables-Columns columns.width
     * @return CrudField
     */
    public function setLpWidth($lpWidth)
    {
        $this->lpWidth = $lpWidth;
        return $this;
    }

    /**
     * 列表页(listpage) 中本字段是否可以排序
     * @return bool
     */
    public function getLpIsSortable()
    {
        return $this->lpIsSortable;
    }

    /**
     * @param bool $lpIsSortable - 列表页(listpage) 中本字段是否可以排序
     * @return CrudField
     */
    public function setLpIsSortable($lpIsSortable)
    {
        $this->lpIsSortable = $lpIsSortable;
        return $this;
    }

    /**
     * 列表页(listpage) 中本字段的前端渲染
     * DataTables-Columns columns.render, 前端渲染
     * @return string|null
     */
    public function getLpRender()
    {
        return $this->lpRender;
    }

    /**
     * @param string|null $lpRender - 列表页(listpage) 中本字段的前端渲染, DataTables-Columns columns.render, 前端渲染
     * @return CrudField
     */
    public function setLpRender($lpRender)
    {
        $this->lpRender = $lpRender;
        return $this;
    }

    /**
     * 列表页(listpage) 中本字段的前端 class
     * DataTables-Columns columns.className
     * @return string|null
     */
    public function getLpClassName()
    {
        return $this->lpClassName;
    }

    /**
     * 预定义的 class :
     * [dt-left, dt-center, dt-right, dt-justify], [dt-nowrap],
     * [dt-head-left, dt-head-center, dt-head-right, dt-head-justify], [dt-head-nowrap],
     * [dt-body-left, dt-body-center, dt-body-right, dt-body-justify], [dt-body-nowrap],
     * [] 中为一组，不同的组可以组合, 例如: dt-center dt-body-left 表示居中对齐,但是 table body 中的内容左对齐
     * @param string|null $lpClassName - 列表页(listpage) 中本字段的前端 class, DataTables-Columns columns.className
     * @return CrudField
     */
    public function setLpClassName($lpClassName)
    {
        $this->lpClassName = $lpClassName;
        return $this;
    }

    /**
     * 编辑页(editpage) 具体用到的用户输入控件
     * null时 编辑页(editpage) 将只展示字段的值，无法展示出一个控件让用户输入
     * @return EditPageInputBase|null
     */
    public function getEpInputWidget()
    {
        return $this->epInputWidget;
    }

    /**
     * @param EditPageInputBase|null $epInputWidget - 编辑页(editpage) 具体用到的用户输入控件, null时 编辑页(editpage) 将只展示字段的值，无法展示出一个控件让用户输入
     * @return CrudField
     */
    public function setEpInputWidget($epInputWidget)
    {
        $this->epInputWidget = $epInputWidget;
        return $this;
    }

}